/*
 * @Author: 0x9DEFA478
 * @Date: 2021-12-17 21:40:46
 * @LastEditTime: 2021-12-18 17:01:10
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#ifndef __IP_SPI_H_
#define __IP_SPI_H_
#include "spi.h"
#include "IP_DMA.h"


//获取发送dma实例
#define cIP_SPI_txDMA(ip_spi) ((ip_spi)->Instance.DMA_Tx->Instance.Instance)

//获取接收dma实例
#define cIP_SPI_rxDMA(ip_spi) ((ip_spi)->Instance.DMA_Rx->Instance.Instance)

//获取spi实例
#define cIP_SPI_SPI(ip_spi)   ((ip_spi)->Instance.Instance)


typedef struct{
  struct{
    SPI_TypeDef* Instance;
    IP_DMA* DMA_Tx;
    IP_DMA* DMA_Rx;
  }Instance;

  unsigned int SCK_DIV;//SCK分频系数
  unsigned int BitWidth;//数据位宽

  union{
    struct{
      volatile int Busy;//此段用于 DMA打开中断的情况下 标记DMA忙碌状态 此段代表空闲时 spi仍有可能在传输
      
      void* volatile Tx_Buffer;
      void* volatile Rx_Buffer;
      volatile int RemainingSize;

      int (* volatile IsBusy)(void*);
      void (* volatile TransStatusRefresh)(void*);

      void* volatile Callback_v;//回调传入参数
      void (* volatile CommunicationDoneCallback)(void*);//通信完成调用 仅发送模式下底层通信可能没有完成(此段在DMA传输完成时被调用)

    }Master;

    struct{
      void* _keep;//暂未实现
    }Slave;
  }Mode;

}IP_SPI;




/**
 * @brief 为全双工模式进行初始化
 * @param ip_spi 新的IP_SPI
 * @param DMA_Tx 发送DMA
 * @param DMA_Rx 接收DMA
 * @param _spi spi句柄
 * @return 无
 */
void IP_SPI_MasterFullDuplex_Init(IP_SPI* ip_spi,IP_DMA* DMA_Tx,IP_DMA* DMA_Rx,SPI_TypeDef* _spi);

/**
 * @brief 为仅发送模式进行初始化
 * @param ip_spi 新的IP_SPI
 * @param DMA_Tx 发送DMA
 * @param _spi spi句柄
 * @return 无
 */
void IP_SPI_MasterOnlyTx_Init(IP_SPI* ip_spi,IP_DMA* DMA_Tx,SPI_TypeDef* _spi);

/**
 * @brief 设置SCK时钟分频
 *        在SPI空闲时才能调用
 * @param ip_spi IP_SPI对象
 * @param SCK_DIV SCK时钟分频 0U~7U 对应2~256分频
 * @return 无
 */
void IP_SPI_Master_SetSCK_DIV(IP_SPI* ip_spi,unsigned int SCK_DIV);




/**
 * @brief SPI是否忙碌
 * @param ip_spi IP_SPI对象
 * @return 0:空闲 SPI可以开始一段新的传输 其他:SPI忙碌
 */
int IP_SPI_Master_IsBusy(IP_SPI* ip_spi);

/**
 * @brief 设置位宽 该方法不会检查BitWidth的合理性
 * 在SPI空闲时才能调用
 * @param ip_spi IP_SPI对象
 * @param BitWidth 位宽
 * @return 无
 */
void IP_SPI_Master_SetBitWidth(IP_SPI* ip_spi,unsigned int BitWidth);

/**
 * @brief 设置中断模式下的传输完成回调
 * 在SPI空闲时才能调用
 * @param ip_spi IP_SPI对象
 * @param Callback 回调函数 在仅发送模式下 此回调被调用时可能SPI仍在传输(虽然DMA已经传输完毕 但还可能有一些数据在spi发送缓存中没有发送完毕) 需调用IP_SPI_Master_IsBusy()来确定真正的状态
 * @param Callback_v 回调函数传入的参数
 * @return 无
 */
void IP_SPI_Master_SetCommunicationDoneCallback(IP_SPI* ip_spi,void (*Callback)(void*),void* Callback_v);








/**
 * @brief SPI发送接收多字节 不阻塞线程 SPI进入忙碌状态直到发送结束
 * 在SPI空闲时才能调用 使用时应注意SPI当前的位宽
 * 使用之前确保已通过调用 IP_SPI_Master_SetCommunicationDoneCallback() 来设置传输完成回调
 * @param ip_spi IP_SPI对象
 * @param TxData 发送数组的头指针
 * @param RxData 接收数组的头指针
 * @param Length 发送数量 单位:字节 长度不限
 * @return 无
 */
void IP_SPI_MasterFullDuplex_byteCommunication(IP_SPI* ip_spi,void* TxData,void* RxData,int Length);

/**
 * @brief SPI发送接收多半字 不阻塞线程 SPI进入忙碌状态直到发送结束
 * 在SPI空闲时才能调用 使用时应注意SPI当前的位宽
 * 使用之前确保已通过调用 IP_SPI_Master_SetCommunicationDoneCallback() 来设置传输完成回调
 * @param ip_spi IP_SPI对象
 * @param TxData 发送数组的头指针
 * @param RxData 接收数组的头指针
 * @param Length 发送数量 单位:字节 长度不限
 * @return 无
 */
void IP_SPI_MasterFullDuplex_uint16Communication(IP_SPI* ip_spi,void* TxData,void* RxData,int Length);




/**
 * @brief SPI发送多字节 不阻塞线程 SPI进入忙碌状态直到发送结束
 * 在SPI空闲时才能调用 使用时应注意SPI当前的位宽
 * 使用之前确保已通过调用 IP_SPI_Master_SetCommunicationDoneCallback() 来设置传输完成回调
 * @param ip_spi IP_SPI对象
 * @param TxData 发送数组的头指针
 * @param Length 发送数量 单位:字节 长度不限
 * @return 无
 */
void IP_SPI_MasterOnlyTx_byteCommunication(IP_SPI* ip_spi,void* TxData,int Length);

/**
 * @brief SPI发送多半字 不阻塞线程 SPI进入忙碌状态直到发送结束
 * 在SPI空闲时才能调用 使用时应注意SPI当前的位宽
 * 使用之前确保已通过调用 IP_SPI_Master_SetCommunicationDoneCallback() 来设置传输完成回调
 * @param ip_spi IP_SPI对象
 * @param TxData 发送数组的头指针
 * @param Length 发送数量 单位:字节 长度不限
 * @return 无
 */
void IP_SPI_MasterOnlyTx_uint16Communication(IP_SPI* ip_spi,void* TxData,int Length);




#endif //__IP_SPI_H_
